/**
 * 命令系统实际使用示例
 * 
 * 展示如何在当前项目中使用命令系统
 * 
 * @author AI Assistant
 * @date 2025-11-26
 */

import { ecs } from "../../../core/ecs/ECS";
import { LogicCmd, CommandPriority } from "./LogicCommandHelper";
import { InterpolatedTransform } from "../component/InterpolatedTransform";
import { ViewComponent } from "../component/ViewComponent";
import { Color } from "cc";

// ==================== 示例 1: 在移动系统中使用命令 ====================

/**
 * 使用命令的移动逻辑系统
 * 
 * 注意：当前项目使用插值渲染，通常不需要在移动系统中发送位置命令
 * 但如果需要特殊效果（如瞬移），可以使用命令
 */
@ecs.register('CommandMovementLogic')
export class CommandMovementLogicSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    filter(): ecs.IMatcher {
        return ecs.allOf(InterpolatedTransform, ViewComponent);
    }
    
    update(entity: ecs.Entity): void {
        const transform = entity.get(InterpolatedTransform)!;
        
        // 正常情况：使用插值渲染系统自动处理位置
        // 但如果需要瞬移（不插值），可以使用命令：
        
        // 示例：如果实体需要瞬移
        if (this.shouldTeleport(entity)) {
            // 使用命令直接设置位置（不插值）
            LogicCmd.setPosition(
                entity.eid,
                transform.position.x,
                transform.position.y,
                0,
                { priority: CommandPriority.HIGH }
            );
        }
    }
    
    private shouldTeleport(entity: ecs.Entity): boolean {
        // 判断是否需要瞬移的逻辑
        return false; // 示例
    }
}

// ==================== 示例 2: 战斗系统中的命令使用 ====================

/**
 * 战斗逻辑系统 - 使用命令发送渲染指令
 */
@ecs.register('CombatLogicWithCommand')
export class CombatLogicSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    filter(): ecs.IMatcher {
        return ecs.allOf(ViewComponent);
    }
    
    /**
     * 处理受击
     */
    onHit(entity: ecs.Entity): void {
        // 1. 播放受击动画（HIGH 优先级）
        LogicCmd.playAnimation(entity.eid, 'hit', false, CommandPriority.HIGH);
        
        // 2. 闪烁效果
        LogicCmd.setSpriteOpacity(entity.eid, 128, CommandPriority.HIGH);
        
        // 3. 延迟恢复透明度
        setTimeout(() => {
            LogicCmd.setSpriteOpacity(entity.eid, 255);
        }, 200);
    }
    
    /**
     * 处理死亡
     */
    onDeath(entity: ecs.Entity): void {
        // 1. 播放死亡动画
        LogicCmd.playAnimation(entity.eid, 'death', false, CommandPriority.HIGH);
        
        // 2. 隐藏实体
        LogicCmd.hide(entity.eid);
        
        // 3. 延迟销毁
        setTimeout(() => {
            LogicCmd.destroyNode(entity.eid, false, CommandPriority.CRITICAL);
        }, 1000);
    }
    
    update(entity: ecs.Entity): void {
        // 战斗逻辑处理
        // ...
    }
}

// ==================== 示例 3: UI 系统使用命令 ====================

/**
 * UI 逻辑系统 - 使用命令更新 UI
 */
@ecs.register('UILogicWithCommand')
export class UILogicSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    private score: number = 0;
    private health: number = 100;
    
    filter(): ecs.IMatcher {
        return ecs.allOf(ViewComponent);
    }
    
    /**
     * 更新分数
     */
    updateScore(entityId: number, points: number): void {
        this.score += points;
        
        // 更新文本
        LogicCmd.setLabelText(entityId, `Score: ${this.score}`);
        
        // 根据分数改变颜色
        if (this.score > 1000) {
            LogicCmd.setLabelColor(entityId, new Color(255, 215, 0)); // 金色
        } else if (this.score > 500) {
            LogicCmd.setLabelColor(entityId, new Color(255, 0, 0)); // 红色
        } else {
            LogicCmd.setLabelColor(entityId, new Color(255, 255, 255)); // 白色
        }
    }
    
    /**
     * 更新血量
     */
    updateHealth(entityId: number, health: number): void {
        this.health = health;
        
        // 更新血量文本
        LogicCmd.setLabelText(entityId, `HP: ${this.health}/100`);
        
        // 根据血量改变颜色
        if (this.health < 30) {
            LogicCmd.setLabelColor(entityId, new Color(255, 0, 0)); // 红色（危险）
        } else if (this.health < 60) {
            LogicCmd.setLabelColor(entityId, new Color(255, 165, 0)); // 橙色（警告）
        } else {
            LogicCmd.setLabelColor(entityId, new Color(0, 255, 0)); // 绿色（安全）
        }
    }
    
    update(entity: ecs.Entity): void {
        // UI 逻辑处理
        // ...
    }
}

// ==================== 示例 4: 动画系统使用命令 ====================

/**
 * 动画逻辑系统 - 使用命令控制动画
 */
@ecs.register('AnimationLogicWithCommand')
export class AnimationLogicSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    private entityStates: Map<number, string> = new Map(); // 实体状态
    
    filter(): ecs.IMatcher {
        return ecs.allOf(ViewComponent);
    }
    
    /**
     * 设置实体状态（自动播放对应动画）
     */
    setEntityState(entity: ecs.Entity, state: 'idle' | 'walk' | 'run' | 'attack' | 'death'): void {
        const oldState = this.entityStates.get(entity.eid);
        
        // 如果状态没变，不处理
        if (oldState === state) {
            return;
        }
        
        // 停止当前动画
        if (oldState) {
            LogicCmd.stopAnimation(entity.eid);
        }
        
        // 播放新动画
        const loop = state !== 'attack' && state !== 'death';
        const priority = state === 'death' ? CommandPriority.HIGH : CommandPriority.NORMAL;
        
        LogicCmd.playAnimation(entity.eid, state, loop, priority);
        
        // 更新状态
        this.entityStates.set(entity.eid, state);
    }
    
    /**
     * 播放攻击序列
     */
    playAttackSequence(entity: ecs.Entity): void {
        // 1. 播放攻击动画
        LogicCmd.playAnimation(entity.eid, 'attack', false, CommandPriority.HIGH);
        
        // 2. 攻击动画结束后恢复待机
        setTimeout(() => {
            this.setEntityState(entity, 'idle');
        }, 1000); // 假设攻击动画 1 秒
    }
    
    update(entity: ecs.Entity): void {
        // 根据实体逻辑状态播放动画
        // 例如：根据速度判断是 walk 还是 run
        // ...
    }
}

// ==================== 示例 5: 批量操作示例 ====================

/**
 * 批量操作工具函数
 */
export class BatchCommandHelper {
    /**
     * 批量隐藏实体
     */
    static hideEntities(entities: ecs.Entity[]): void {
        const entityIds = entities.map(e => e.eid);
        LogicCmd.batchSetVisible(entityIds, false);
    }
    
    /**
     * 批量显示实体
     */
    static showEntities(entities: ecs.Entity[]): void {
        const entityIds = entities.map(e => e.eid);
        LogicCmd.batchSetVisible(entityIds, true);
    }
    
    /**
     * 批量播放动画
     */
    static playAnimationForAll(entities: ecs.Entity[], animName: string, loop: boolean = false): void {
        const animations = entities.map(e => ({
            entityId: e.eid,
            animName,
            loop
        }));
        LogicCmd.batchPlayAnimation(animations);
    }
    
    /**
     * 批量设置颜色
     */
    static setColorForAll(entities: ecs.Entity[], color: Color): void {
        // 注意：批量设置颜色需要逐个发送命令
        for (const entity of entities) {
            LogicCmd.setSpriteColor(entity.eid, color);
        }
    }
}

// ==================== 示例 6: 完整使用流程 ====================

/**
 * 完整使用示例
 */
export async function commandSystemUsageExample(): Promise<void> {
    console.log('\n========== 命令系统使用示例 ==========\n');
    
    // 1. 创建实体
    const entity = ecs.getEntity(ecs.Entity);
    const transform = entity.add(InterpolatedTransform);
    transform.setPosition(0, 0, 0);
    transform.syncPreviousFrame();
    
    console.log(`创建实体: ${entity.eid}`);
    
    // 2. 发送各种命令
    console.log('\n发送命令:');
    
    // 位置命令
    LogicCmd.setPosition(entity.eid, 100, 200);
    console.log('  - 设置位置 (100, 200)');
    
    // 动画命令
    LogicCmd.playAnimation(entity.eid, 'idle', true);
    console.log('  - 播放待机动画');
    
    // 颜色命令
    LogicCmd.setSpriteColor(entity.eid, new Color(255, 255, 255));
    console.log('  - 设置颜色为白色');
    
    // 3. 使用高优先级命令
    setTimeout(() => {
        LogicCmd.playAnimation(entity.eid, 'attack', false, CommandPriority.HIGH);
        console.log('  - 播放攻击动画（高优先级）');
    }, 2000);
    
    // 4. 批量操作
    const entities = [entity]; // 示例：只有一个实体
    BatchCommandHelper.playAnimationForAll(entities, 'walk', true);
    console.log('  - 批量播放动画');
    
    console.log('\n========== 示例完成 ==========\n');
}

// ==================== 导出 ====================

export const CommandSystemExamples = {
    usageExample: commandSystemUsageExample,
    BatchCommandHelper
};

